package q1.project.core.base;

import lombok.extern.slf4j.Slf4j;
import q1.project.common.util.SpringContextUtil;

/**
 * 基础控制器 提供通用的分页查询方法
 *
 * @author Q1 Team
 * @version 1.0
 */
@Slf4j
public abstract class BaseController {

  /** 获取AuthApiService实例（运行时通过反射获取，避免编译期依赖） */
  private Object getAuthApiService() {
    try {
      Class<?> authApiServiceClass =
          Class.forName("q1.project.modules.system.auth.api.service.AuthApiService");
      return SpringContextUtil.getBean(authApiServiceClass);
    } catch (ClassNotFoundException e) {
      return null;
    }
  }

  /**
   * 获取当前登录用户ID
   *
   * @return 用户ID（String类型），未登录返回 null
   */
  protected String getCurrentUserId() {
    try {
      Object authApiService = getAuthApiService();
      if (authApiService == null) {
        return null;
      }
      // 调用 getCurrentUserId() 方法
      java.lang.reflect.Method method = authApiService.getClass().getMethod("getCurrentUserId");
      Long userId = (Long) method.invoke(authApiService);
      return userId != null ? userId.toString() : null;
    } catch (Exception e) {
      log.debug("获取当前用户ID失败", e);
      return null;
    }
  }

  /**
   * 获取当前登录用户名
   *
   * @return 用户名，未登录返回 null
   */
  protected String getCurrentUsername() {
    try {
      Object authApiService = getAuthApiService();
      if (authApiService == null) {
        return null;
      }
      // 调用 getCurrentUsername() 方法
      java.lang.reflect.Method method = authApiService.getClass().getMethod("getCurrentUsername");
      return (String) method.invoke(authApiService);
    } catch (Exception e) {
      log.debug("获取当前用户名失败", e);
      return null;
    }
  }

  /** 处理分页查询参数 自动校验和设置默认值 */
  protected <T extends PageQuery> T handlePageQuery(T query) {
    if (query == null) {
      try {
        @SuppressWarnings("unchecked")
        T newQuery = (T) PageQuery.class.getDeclaredConstructor().newInstance();
        query = newQuery;
      } catch (Exception e) {
        log.error("创建PageQuery实例失败", e);
        throw new RuntimeException("分页参数初始化失败");
      }
    }
    query.validate();
    return query;
  }

  /** 记录查询日志 */
  protected void logQuery(String operation, PageQuery query) {
    log.info(
        "{}: page={}, size={}, sortBy={}, sortOrder={}, keyword={}",
        operation,
        query.getPage(),
        query.getSize(),
        query.getSortBy(),
        query.getSortOrder(),
        query.getKeyword());
  }

  /** 记录操作日志 */
  protected void logOperation(String operation, Object... params) {
    log.info("{}: {}", operation, params);
  }
}
